/**
 * 全局请求配置，配置baseUrl、请求方式、请求头等
 * 请求前拦截request，设置token
 * 请求后拦截reponse，全局状态码判断，统一异常处理
 * @Author liyuyang
 * @Date 2020-09-09
 * @Email 15615676670@163.com
 */
const url_dev = 'http://192.168.9.84:8888/app'
const url_test = 'http://192.168.9.63:8080/api'
const url_prod = 'http://222.173.147.202:50025/api'

/* 设置全局配置 */
const install = (Vue, vm) => {

	// 此为自定义配置参数，具体参数见上方说明
	Vue.prototype.$u.http.setConfig({
		baseUrl: url_test,
		showLoading: true, // 是否显示请求中的loading
		loadingText: '请求中...', // 请求loading中的文字提示
		loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
		loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
		originalData: true, // 是否在拦截器中返回服务端的原始数据
		// 设置自定义头部content-type
		header: {
			"X-Requested-With": "XMLHttpRequest",
			"Content-Type": "application/x-www-form-urlencoded"
		}
	});

	/**
	 * 请求之前拦截器
	 * 设置token
	 * 可以使用async await 做异步操作
	 */
	Vue.prototype.$u.http.interceptor.request = (config) => {
		if (config.url !== '/login') {
			const token = uni.getStorageSync('token')
			if (vm.$u.test.isEmpty(token)) {
				toLogin(vm)
				return false
			}
			config.header.Authorization = 'Bearer ' + token
		}
		return config
	}

	/**
	 * 响应拦截器
	 * 每次请求结束都会执行本方法
	 * 对全局状态码判断，统一异常处理
	 * 可以使用async await 做异步操作 
	 */
	Vue.prototype.$u.http.interceptor.response = (response) => {
		if (response.statusCode === 200) {
			const res = response.data
			if (res.code == 200) {
				return res;
			} else {
				if (res.code === 500) { // 错误
					vm.$u.toast(res.msg);
				} else if (res.code === 401) { // 未登录
					toLogin(vm)
				} else if (res.code === 403) { // 无权限
					vm.$u.toast('您没有权限访问该页面！')
				}
				return false;
			}
		} else {
			vm.$u.throttle(() => {
				console.log('请求失败，服务器异常')
				vm.$u.toast('服务器或网络异常')
			}, 500)
			return false;
		}
	}
}

// 跳转到登录页面，500ms内只触发一次
function toLogin(vm) {
	vm.$u.throttle(() => {
		vm.$u.toast('验证失败，请重新登录');
		setTimeout(() => {
			console.log(111)
			vm.$u.route('/pages/my/login')
		}, 1500)
	}, 500)
}

export default {
	install
}
